package io.gitee.macxiang.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import io.gitee.macxiang._Enum.FieldStrategy;
import io.gitee.macxiang._Enum.OrderBy;

/** 该注解用于标记实体类中的字段，如何映射实体类字段到数据库表字段。<br>
 *  如果你的实体类字段名遵循驼峰命名规则，并且与数据库表字段名一致，你可以省略这个注解。
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface TableField {

  /** 指定数据库中的字段名。 */
  String value() default "";

  /** 添加反引号 `; 如果数据库表名与系统关键字重合等,需要添加反引号加以区分 */
  boolean backtick() default true;

  /** 指示这个字段是否存在于数据库表中。如果设置为 false，在生成 SQL 时会忽略这个字段。 */
  boolean exist() default true;

  /** 指示这个字段是否在select时存在 */
  boolean select() default true;

  /** 指定在插入时，值为null时的替换策略。 */
  FieldStrategy insertStrategy() default FieldStrategy.CUSTOM;

  /** 自定义插入语句;当insertStrategy值为custom时有效 */
  String insertCustom() default "DEFAULT";

  /** 指定在修改时，值为null时的替换策略。 */
  FieldStrategy updateStrategy() default FieldStrategy.NONE;

  /** 自定义更新语句;当updateStrategy值为custom时有效 */
  String updateCustom() default "DEFAULT";

  /** 在没有ORDER BY语句时 的排序规则 */
  OrderBy orderBy() default OrderBy.NULL;

  /** 默认限制长度 */
  int limit() default 10;
}
